#!/usr/bin/env python3
"""
接口关联发现与管理系统
整合所有功能的主控制脚本
"""

import os
import sys
import json
from datetime import datetime
import subprocess

class APIDataManagementSystem:
    """API数据管理系统"""

    def __init__(self):
        self.data_dir = "数据清洗"
        self.script_dir = "脚本"
        self.ensure_directories()

    def ensure_directories(self):
        """确保必要的目录存在"""
        for directory in [self.data_dir, self.script_dir]:
            if not os.path.exists(directory):
                os.makedirs(directory)
                print(f"✅ 创建目录: {directory}")

    def clear_screen(self):
        """清屏"""
        os.system('cls' if os.name == 'nt' else 'clear')

    def show_main_menu(self):
        """显示主菜单"""
        self.clear_screen()
        print("=" * 80)
        print("🚀 接口关联发现与管理系统")
        print("=" * 80)
        print("📋 功能模块:")
        print("1. 📊 数据提取 - 从数据库提取requests和responses数据")
        print("2. 🧹 数据清洗 - 清洗和过滤接口数据")
        print("3. 📈 域名统计 - 按域名统计分析接口")
        print("4. 🔍 数据过滤 - 按域名二次清洗接口")
        print("5. 📊 可视化图表 - 生成统计图表")
        print("6. 🔧 数据库探索 - 探索数据库结构")
        print("7. ⚙️ 系统设置 - 配置和工具")
        print("8. 📚 帮助文档 - 查看使用说明")
        print("0. 🚪 退出系统")
        print("=" * 80)

    def extract_data(self):
        """数据提取功能"""
        print("\n" + "=" * 60)
        print("📊 数据提取模块")
        print("=" * 60)

        extract_script = os.path.join(self.script_dir, "extract_data.py")
        if not os.path.exists(extract_script):
            print("❌ 数据提取脚本不存在")
            return

        print("📋 功能说明:")
        print("  - 从SQLite数据库提取requests和responses数据")
        print("  - 支持多种表结构识别")
        print("  - 输出标准JSON格式")
        print("  - 自动处理编码问题")

        print("\n当前可用的数据文件:")
        if os.path.exists("data/crawler.db"):
            print("  ✅ data/crawler.db (SQLite数据库)")
        else:
            print("  ❌ 未找到数据库文件 data/crawler.db")

        print("\n提取的数据文件:")
        if os.path.exists(self.data_dir):
            extracted_files = [f for f in os.listdir(self.data_dir) if f.startswith('extracted_data_')]
            if extracted_files:
                for f in extracted_files[-3:]:  # 显示最近3个
                    file_path = os.path.join(self.data_dir, f)
                    file_size = os.path.getsize(file_path) / (1024 * 1024)  # MB
                    print(f"  📄 {f} ({file_size:.1f} MB)")
            else:
                print("  ⚠️  没有找到提取的数据文件")
        else:
            print("  ⚠️  数据清洗目录不存在")

        choice = input("\n是否执行数据提取? (y/n): ").strip().lower()
        if choice == 'y':
            try:
                print("\n🚀 开始数据提取...")
                result = subprocess.run([sys.executable, extract_script],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
                print("✅ 数据提取完成!")
            except Exception as e:
                print(f"❌ 数据提取失败: {e}")

    def clean_data(self):
        """数据清洗功能"""
        print("\n" + "=" * 60)
        print("🧹 数据清洗模块")
        print("=" * 60)

        print("📋 功能说明:")
        print("  - 过滤HTML响应内容")
        print("  - 过滤二进制数据和乱码")
        print("  - 过滤CSS、JS、图片等静态资源")
        print("  - 保留JSON、表单、XML等API数据")
        print("  - 智能去重和数据标准化")

        # 显示现有的清洗文件
        print("\n已清洗的数据文件:")
        if os.path.exists(self.data_dir):
            cleaned_files = [f for f in os.listdir(self.data_dir)
                           if f.startswith('cleaned_') or f.startswith('fixed_cleaned_')]
            if cleaned_files:
                for f in cleaned_files[-3:]:  # 显示最近3个
                    file_path = os.path.join(self.data_dir, f)
                    with open(file_path, 'r', encoding='utf-8') as file:
                        data = json.load(file)
                        interfaces = data.get('total_interfaces', 0)
                        records = data.get('processed_records', 0)
                        print(f"  📄 {f} ({interfaces} 接口, {records} 记录)")
            else:
                print("  ⚠️  没有找到清洗后的数据文件")
        else:
            print("  ⚠️  数据清洗目录不存在")

        choice = input("\n是否执行数据清洗? (y/n): ").strip().lower()
        if choice == 'y':
            try:
                print("\n🚀 开始数据清洗...")
                result = subprocess.run([sys.executable, "数据清洗.py"],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
                print("✅ 数据清洗完成!")
            except Exception as e:
                print(f"❌ 数据清洗失败: {e}")

    def domain_statistics(self):
        """域名统计功能"""
        print("\n" + "=" * 60)
        print("📈 域名统计模块")
        print("=" * 60)

        print("📋 功能说明:")
        print("  - 统计每个域名的接口数量")
        print("  - 自动域名分类 (Google、Microsoft、API服务等)")
        print("  - HTTP方法和状态码分析")
        print("  - 响应大小统计")
        print("  - 生成详细JSON报告")

        # 检查是否有清洗后的数据
        has_cleaned_data = False
        if os.path.exists(self.data_dir):
            cleaned_files = [f for f in os.listdir(self.data_dir)
                           if f.startswith('cleaned_') or f.startswith('fixed_cleaned_')]
            has_cleaned_data = len(cleaned_files) > 0

        if not has_cleaned_data:
            print("\n⚠️  没有找到清洗后的数据文件")
            print("请先运行数据清洗功能生成清洗数据")
            return

        # 显示现有统计文件
        print("\n域名统计文件:")
        stats_files = [f for f in os.listdir(self.data_dir)
                      if f.startswith('domain_statistics_')]
        if stats_files:
            for f in stats_files[-3:]:  # 显示最近3个
                file_path = os.path.join(self.data_dir, f)
                file_size = os.path.getsize(file_path) / 1024  # KB
                print(f"  📄 {f} ({file_size:.1f} KB)")
        else:
            print("  ⚠️  没有找到域名统计文件")

        choice = input("\n是否执行域名统计? (y/n): ").strip().lower()
        if choice == 'y':
            try:
                print("\n🚀 开始域名统计...")
                result = subprocess.run([sys.executable, "域名统计.py"],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
                print("✅ 域名统计完成!")
            except Exception as e:
                print(f"❌ 域名统计失败: {e}")

    def data_filtering(self):
        """数据过滤功能（二次清洗）"""
        print("\n" + "=" * 60)
        print("🔍 数据过滤模块")
        print("=" * 60)

        print("📋 功能说明:")
        print("  - 按域名过滤接口数据")
        print("  - 支持多种过滤方式:")
        print("    • 按编号选择域名")
        print("    • 关键词搜索域名")
        print("    • 按分类批量过滤")
        print("    • 选择Top N域名")
        print("  - 交互式操作界面")
        print("  - 生成过滤后的独立数据文件")

        # 检查是否有统计数据
        has_stats_data = False
        if os.path.exists(self.data_dir):
            stats_files = [f for f in os.listdir(self.data_dir)
                          if f.startswith('domain_statistics_')]
            has_stats_data = len(stats_files) > 0

        if not has_stats_data:
            print("\n⚠️  没有找到域名统计文件")
            print("请先运行域名统计功能生成统计数据")
            return

        # 显示过滤后的文件
        print("\n已过滤的数据文件:")
        filtered_files = [f for f in os.listdir(self.data_dir)
                         if f.startswith('filtered_interfaces_')]
        if filtered_files:
            for f in filtered_files[-3:]:  # 显示最近3个
                file_path = os.path.join(self.data_dir, f)
                with open(file_path, 'r', encoding='utf-8') as file:
                    data = json.load(file)
                    domains = data.get('metadata', {}).get('target_domains', [])
                    interfaces = data.get('total_filtered_interfaces', 0)
                    print(f"  📄 {f} ({len(domains)} 域名, {interfaces} 接口)")
        else:
            print("  ⚠️  没有找到过滤后的数据文件")

        choice = input("\n是否启动数据过滤功能? (y/n): ").strip().lower()
        if choice == 'y':
            try:
                print("\n🚀 启动数据过滤功能...")
                result = subprocess.run([sys.executable, "域名统计.py"],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
                print("✅ 数据过滤功能运行完成!")
            except Exception as e:
                print(f"❌ 启动数据过滤功能失败: {e}")

    def visualization(self):
        """可视化功能"""
        print("\n" + "=" * 60)
        print("📊 可视化图表模块")
        print("=" * 60)

        print("📋 功能说明:")
        print("  - Top域名柱状图")
        print("  - 域名分类饼图")
        print("  - HTTP方法分布图")
        print("  - 响应大小对比图")
        print("  - 自动保存为PNG图片")

        # 检查matplotlib依赖
        try:
            import matplotlib
            print("  ✅ matplotlib已安装")
        except ImportError:
            print("  ⚠️  matplotlib未安装，无法生成图表")
            print("  请运行: pip install matplotlib")

        # 检查是否有统计文件
        has_stats_data = False
        if os.path.exists(self.data_dir):
            stats_files = [f for f in os.listdir(self.data_dir)
                          if f.startswith('domain_statistics_')]
            has_stats_data = len(stats_files) > 0

        if not has_stats_data:
            print("\n⚠️  没有找到域名统计文件")
            print("请先运行域名统计功能生成统计数据")
            return

        # 显示图表文件
        print("\n已生成的图表文件:")
        chart_files = [f for f in os.listdir(self.data_dir)
                      if f.endswith('.png')]
        if chart_files:
            for f in chart_files[-5:]:  # 显示最近5个
                file_path = os.path.join(self.data_dir, f)
                file_size = os.path.getsize(file_path) / 1024  # KB
                print(f"  🖼️  {f} ({file_size:.1f} KB)")
        else:
            print("  ⚠️  没有找到图表文件")

        choice = input("\n是否生成可视化图表? (y/n): ").strip().lower()
        if choice == 'y':
            try:
                print("\n🚀 开始生成可视化图表...")
                result = subprocess.run([sys.executable, "域名统计可视化.py"],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
                print("✅ 可视化图表生成完成!")
            except Exception as e:
                print(f"❌ 生成可视化图表失败: {e}")

    def database_exploration(self):
        """数据库探索功能"""
        print("\n" + "=" * 60)
        print("🔧 数据库探索模块")
        print("=" * 60)

        print("📋 可用工具:")
        print("1. 📊 数据库探索 - 深度分析数据库结构")
        print("2. 🗃️  数据库检查 - 基本信息检查")
        print("3. 📈 数据分析 - 运行数据分析")
        print("4. ⬅️  返回主菜单")

        choice = input("\n请选择功能 (1-4): ").strip()

        if choice == "1":
            # 数据库探索
            explore_script = os.path.join(self.script_dir, "explore_database.py")
            if os.path.exists(explore_script):
                try:
                    print("\n🚀 启动数据库探索...")
                    result = subprocess.run([sys.executable, explore_script],
                                          capture_output=False, text=True,
                                          cwd=os.getcwd())
                except Exception as e:
                    print(f"❌ 数据库探索失败: {e}")
            else:
                print("❌ 数据库探索脚本不存在")

        elif choice == "2":
            # 数据库检查
            check_script = os.path.join(self.script_dir, "examine_db.py")
            if os.path.exists(check_script):
                try:
                    print("\n🚀 启动数据库检查...")
                    result = subprocess.run([sys.executable, check_script],
                                          capture_output=False, text=True,
                                          cwd=os.getcwd())
                except Exception as e:
                    print(f"❌ 数据库检查失败: {e}")
            else:
                print("❌ 数据库检查脚本不存在")

        elif choice == "3":
            # 数据分析
            analysis_script = os.path.join(self.script_dir, "run_analysis.py")
            if os.path.exists(analysis_script):
                try:
                    print("\n🚀 启动数据分析...")
                    result = subprocess.run([sys.executable, analysis_script],
                                          capture_output=False, text=True,
                                          cwd=os.getcwd())
                except Exception as e:
                    print(f"❌ 数据分析失败: {e}")
            else:
                print("❌ 数据分析脚本不存在")

        elif choice == "4":
            return
        else:
            print("❌ 无效选择")

    def system_settings(self):
        """系统设置"""
        print("\n" + "=" * 60)
        print("⚙️  系统设置模块")
        print("=" * 60)

        print("📋 系统信息:")
        print(f"  📁 工作目录: {os.getcwd()}")
        print(f"  🐍 Python版本: {sys.version}")
        print(f"  💻 操作系统: {os.name}")

        print("\n📁 目录结构:")
        directories = [self.data_dir, self.script_dir, "data", "项目文档"]
        for directory in directories:
            if os.path.exists(directory):
                file_count = len([f for f in os.listdir(directory)
                               if os.path.isfile(os.path.join(directory, f))])
                print(f"  📂 {directory}/ ({file_count} 个文件)")

        print("\n📄 数据文件状态:")
        # 数据库文件
        if os.path.exists("data/crawler.db"):
            size = os.path.getsize("data/crawler.db") / (1024 * 1024)
            print(f"  🗄️  data/crawler.db ({size:.1f} MB)")
        else:
            print("  ❌ data/crawler.db (不存在)")

        # 清洗文件
        if os.path.exists(self.data_dir):
            cleaned_files = [f for f in os.listdir(self.data_dir)
                           if f.startswith('cleaned_') or f.startswith('fixed_cleaned_')]
            print(f"  🧹 清洗后的文件 ({len(cleaned_files)} 个)")

        # 统计文件
        if os.path.exists(self.data_dir):
            stats_files = [f for f in os.listdir(self.data_dir)
                          if f.startswith('domain_statistics_')]
            print(f"  📊 统计文件 ({len(stats_files)} 个)")

        print("\n🔧 快速操作:")
        print("1. 🗑️  清理临时文件")
        print("2. 📋 生成文件清单")
        print("3. 🧪 测试URL标准化")
        print("4. ⬅️  返回主菜单")

        choice = input("\n请选择操作 (1-4): ").strip()

        if choice == "1":
            # 清理临时文件
            print("\n🗑️  清理临时文件...")
            temp_extensions = ['.pyc', '.log']
            cleaned_count = 0

            for root, dirs, files in os.walk("."):
                for file in files:
                    if any(file.endswith(ext) for ext in temp_extensions):
                        file_path = os.path.join(root, file)
                        try:
                            os.remove(file_path)
                            cleaned_count += 1
                        except:
                            pass

            print(f"✅ 清理完成! 删除了 {cleaned_count} 个临时文件")

        elif choice == "2":
            # 生成文件清单
            print("\n📋 生成文件清单...")
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            inventory_file = f"文件清单_{timestamp}.txt"

            try:
                with open(inventory_file, 'w', encoding='utf-8') as f:
                    f.write("接口管理系统文件清单\n")
                    f.write("=" * 50 + "\n")
                    f.write(f"生成时间: {datetime.now().isoformat()}\n\n")

                    for root, dirs, files in os.walk("."):
                        # 跳过__pycache__目录
                        dirs[:] = [d for d in dirs if d != '__pycache__']

                        for file in files:
                            if not file.endswith('.pyc'):
                                file_path = os.path.join(root, file)
                                rel_path = os.path.relpath(file_path)
                                size = os.path.getsize(file_path)
                                mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
                                f.write(f"{mtime.strftime('%Y-%m-%d %H:%M:%S')}  {size:>10}  {rel_path}\n")

                print(f"✅ 文件清单已生成: {inventory_file}")
            except Exception as e:
                print(f"❌ 生成文件清单失败: {e}")

        elif choice == "3":
            # 测试URL标准化
            print("\n🧪 测试URL标准化...")
            try:
                result = subprocess.run([sys.executable, "测试URL标准化.py"],
                                      capture_output=False, text=True,
                                      cwd=os.getcwd())
            except Exception as e:
                print(f"❌ URL标准化测试失败: {e}")

        elif choice == "4":
            return
        else:
            print("❌ 无效选择")

    def show_help(self):
        """显示帮助文档"""
        print("\n" + "=" * 60)
        print("📚 帮助文档")
        print("=" * 60)

        print("📋 可用文档文件:")
        help_files = [
            "快速开始.md",
            "数据清洗使用说明.md",
            "域名统计使用说明.md",
            "URL标准化修复说明.md",
            "CLAUDE.md"
        ]

        for help_file in help_files:
            if os.path.exists(help_file):
                size = os.path.getsize(help_file) / 1024  # KB
                print(f"  📄 {help_file} ({size:.1f} KB)")
            else:
                print(f"  ❌ {help_file} (不存在)")

        print("\n🔗 快速链接:")
        print("1. 📖 查看快速开始指南")
        print("2. 🧹 查看数据清洗说明")
        print("3. 📊 查看域名统计说明")
        print("4. ⬅️  返回主菜单")

        choice = input("\n请选择文档 (1-4): ").strip()

        if choice == "1" and os.path.exists("快速开始.md"):
            self.show_file_content("快速开始.md")
        elif choice == "2" and os.path.exists("数据清洗使用说明.md"):
            self.show_file_content("数据清洗使用说明.md")
        elif choice == "3" and os.path.exists("域名统计使用说明.md"):
            self.show_file_content("域名统计使用说明.md")
        elif choice == "4":
            return
        else:
            print("❌ 无效选择或文件不存在")

    def show_file_content(self, filename):
        """显示文件内容"""
        try:
            with open(filename, 'r', encoding='utf-8') as f:
                content = f.read()

            print(f"\n📖 {filename}")
            print("=" * 60)
            # 只显示前50行，避免内容过长
            lines = content.split('\n')
            for i, line in enumerate(lines[:50]):
                print(f"{i+1:3d}: {line}")

            if len(lines) > 50:
                print(f"\n... (文件还有 {len(lines)-50} 行)")

            input(f"\n按回车键继续...")
        except Exception as e:
            print(f"❌ 读取文件失败: {e}")

    def run(self):
        """运行主程序"""
        while True:
            try:
                self.show_main_menu()
                choice = input("\n请选择功能 (0-8): ").strip()

                if choice == "0":
                    print("\n👋 感谢使用接口关联发现与管理系统!")
                    break
                elif choice == "1":
                    self.extract_data()
                elif choice == "2":
                    self.clean_data()
                elif choice == "3":
                    self.domain_statistics()
                elif choice == "4":
                    self.data_filtering()
                elif choice == "5":
                    self.visualization()
                elif choice == "6":
                    self.database_exploration()
                elif choice == "7":
                    self.system_settings()
                elif choice == "8":
                    self.show_help()
                else:
                    print("❌ 无效选择，请重新输入")

                if choice != "0":
                    input("\n按回车键继续...")

            except KeyboardInterrupt:
                print("\n\n👋 程序被用户中断，退出系统")
                break
            except Exception as e:
                print(f"❌ 程序出错: {e}")
                input("按回车键继续...")

def main():
    """主函数"""
    print("🚀 启动接口关联发现与管理系统...")

    try:
        system = APIDataManagementSystem()
        system.run()
    except Exception as e:
        print(f"❌ 系统启动失败: {e}")
        input("按回车键退出...")

if __name__ == "__main__":
    main()